Springboot中PO、VO对象间的转换 您所在的位置:网站首页 springboot entity 转vo Springboot中PO、VO对象间的转换

Springboot中PO、VO对象间的转换

2024-07-09 16:33| 来源: 网络整理| 查看: 265

方式一:BeanUtils.copyProperties           在导包的时候要留意, spring有BeanUtils、apache的commons也有BeanUtils ,所以导包不一样用法也不一样。 —org.apache.commons.beanutils.BeanUtilsorg.springframework.beans.BeanUtils方法copyPropertiescopyProperties参数dest,srcsrc,dest

下面只对org.springframework.beans.BeanUtils中的copyProperties做解释:

BeanUtils.copyProperties(src, dest);

dest中的存在的属性,src中一定要有,但是src中可以有多余的属性;

src中与dest中相同的属性都会被替换,不管是否有值;

src、 dest中的属性要名字相同,才能被赋值,不然的话需要手动赋值;

如果存在属性完全相同的内部类,但是不是同一个内部类,即分别属于各自的内部类,则spring会认为属性不同,不会copy;

举例:

对象category 和categoryTestVo属性如下:

category :

@Data public class Category{    /**     * id     */    private Integer id;            /**    * 标题    */    private String title; ​        /**     * 创建时间     */    private Date createTime;    /**     * 更新时间     */    private Date updateTime;    /**     * 状态     */    private StatusEntity status;       }

categoryTestVo:

@Data @AllArgsConstructor @NoArgsConstructor public class CategoryTestVo {    private Integer id;    private String title; ​ }

测试类:

@Autowired    private CategoryService categoryService;    @Test    void testBeanUtils() {        List list = categoryService.list();        list.forEach(item->{            //遍历出集合中的每一个对象,再复制给categoryTestVo            CategoryTestVo categoryTestVo = new CategoryTestVo();            BeanUtils.copyProperties(item,categoryTestVo);            System.out.println(categoryTestVo);       });   }

测试结果如下: 

当categgoryTestVo中有的属性,category中没有时: ​

@Data @AllArgsConstructor @NoArgsConstructor public class CategoryTestVo {    private Integer id;    private String title;    //这两个是刚刚新增的    private String content; ​    private String sex; ​ }

测试结果如下:

方式二:MapStruct

导入依赖:

           org.mapstruct            mapstruct            1.5.3.Final                            org.mapstruct            mapstruct-processor            1.5.3.Final        

创建接口:

注意:这个包别导错了,是mapstruct的包

import com.hcnu.entity.Category; import com.hcnu.vo.CategoryTestVo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; ​ /** * @ClassName TestConverter * @Description TODO * @Author liang * @Date 2023/4/16 10:08 * @Version 1.0 **/ ​ @Mapper public interface TestConverter { ​    //获取该类自动生成的实现类的实例    TestConverter INSTANCES = Mappers.getMapper(TestConverter.class);        //这里字段一样,就不要写映射了    CategoryTestVo toCategoryTestVo(Category category); ​ } ​

测试类:

@Test    void TestMapStruct(){        TestConverter converter = TestConverter.INSTANCES;        List list = categoryService.list();        list.forEach(item->{            //这里把集合遍历出来,获取里面的每一个对象            CategoryTestVo categoryTestVo = converter.toCategoryTestVo(item);            System.out.println(categoryTestVo);       }); ​   }

当索要映射的字段不一致的时候:

category的字段如上,未发生改变

CategoryTestVo:

@Data @AllArgsConstructor @NoArgsConstructor public class CategoryTestVo {    private Integer categoryId;    private String categoryTitle; ​    private String content; ​    private String sex; ​ }

对应得接口:

import com.hcnu.entity.Category; import com.hcnu.vo.CategoryTestVo; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; ​ /** * @ClassName TestConverter * @Description TODO * @Author liang * @Date 2023/4/16 10:08 * @Version 1.0 **/ ​ @Mapper public interface TestConverter { ​    //获取该类自动生成的实现类的实例    TestConverter INSTANCES = Mappers.getMapper(TestConverter.class); ​    //这里字段一样,就不要写了    @Mappings({            @Mapping(source = "id",target = "categoryId"),            @Mapping(source = "title",target = "categoryTitle")   })    CategoryTestVo toCategoryTestVo(Category category); ​ }

测试类:

 @Test    void TestMapStruct(){        TestConverter converter = TestConverter.INSTANCES;        List list = categoryService.list();        list.forEach(item->{            CategoryTestVo categoryTestVo = converter.toCategoryTestVo(item);            System.out.println(categoryTestVo);       }); ​   }

测试结果:

当所对应的字段分别是两个对象的属性的时候:

@Data @AllArgsConstructor @NoArgsConstructor public class UserTestVo { //这个是SysUser实体类的属性    private String username;    //这两个是SysRole中的属性    private String sysRoleTitle; ​    private String role; } ​

对应的接口:

import com.hcnu.entity.SysRole; import com.hcnu.entity.SysUser; import com.hcnu.vo.UserTestVo; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; ​ ​ @Mapper public interface UserConverter {    UserConverter INSTANCES = Mappers.getMapper(UserConverter.class); ​    @Mappings({            @Mapping(source = "sysUser.username",target = "username"),            @Mapping(source = "sysRole.title",target = "sysRoleTitle"),            @Mapping(source = "sysRole.role",target = "role")   })    UserTestVo toUserTestVo(SysUser sysUser, SysRole sysRole); }

测试类:

void TestMapStruct2(){ ​        UserConverter converter = UserConverter.INSTANCES;        List list = sysUserService.list();        sysRoleService.list().stream().forEach(item->{            list.forEach(user->{                UserTestVo userTestVo = converter.toUserTestVo(user, item);                System.out.println(userTestVo);           });       }); ​   }

测试结果:

以上是个人理解,可能描述的过程不够清晰和有很多不足,水平有限,理解的没有那么透彻,希望大家批评指正!!!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有